package v1ch05.arrays;

import java.lang.reflect.*;
import java.util.*;

/**
 * 该程序演示了如何使用反射来处理数组。
 *
 * @author Cay Horstmann
 * @version 1.2 2012-05-04
 */
public class CopyOfTest {
	public static void main(String[] args) {
		int[] a = {1, 2, 3};
		a = (int[]) goodCopyOf(a, 10);
		System.out.println(Arrays.toString(a));
		
		String[] b = {"Tom", "Dick", "Harry"};
		b = (String[]) goodCopyOf(b, 10);
		System.out.println(Arrays.toString(b));
		
		System.out.println("以下调用将生成异常。");
		b = (String[]) badCopyOf(b, 10);
	}
	
	/**
	 * 此方法尝试通过分配新数组并复制所有元素来增大数组。
	 *
	 * @param a         增长的数组
	 * @param newLength 新长度
	 * @return 包含a的所有元素的更大数组。但是，返回的数组具有*类型Object []，与
	 */
	public static Object[] badCopyOf(Object[] a, int newLength) // not useful
	{
		Object[] newArray = new Object[newLength];
		System.arraycopy(a, 0, newArray, 0, Math.min(a.length, newLength));
		return newArray;
	}
	
	/**
	 * 此方法通过分配相同类型的新数组并*复制所有元素来增长数组。
	 *
	 * @param a 数组增长。这可以是对象数组或原始*类型数组
	 * @return 包含a的所有元素的更大数组。
	 */
	public static Object goodCopyOf(Object a, int newLength) {
		Class cl = a.getClass();
		if (!cl.isArray()) return null;
		Class componentType = cl.getComponentType();
		int length = Array.getLength(a);
		Object newArray = Array.newInstance(componentType, newLength);
		System.arraycopy(a, 0, newArray, 0, Math.min(length, newLength));
		return newArray;
	}
}
